在昨天的談true or false一文裡,提到了驚嘆號,做為布林值反值使用。
布林值做為程式裡的旗幟、開關或參數,經常會用來存放狀態值,例如使用者是否還在線上,東西還有沒有庫存,下注之後是否己經settled,或者直播主是否還在線上...等,都會用到布林值做判斷。
語法也很簡單,就是
bool IsOK = true;
通常他的預設值都是false或是0,表示為負狀態。
就這麼一個小東西,如果在命名上或使用上沒有要求,也會發生一些微妙的錯誤,例如:
if(!IsNotOK == false){
}
我自己都不知道自己在寫什麼,所以我們來分解看看這個判斷式要什麼東西。
程式語言是個由左到右的語法,所以這句話的意思應該是:
如果 Not IsNotOK 是 false的話
基本負負得正的原理,等號前後會變成 IsNotOK == true,所以是
如果 IsNotOK 是 true的話
所以什麼是是IsNotOK?
說了那麼多,其實就是要表達一件事:在布林值的參數,或方法的命名時,應該要用Positive naming。例如:
bool IsLogin;
bool HasToken;
bool CanGetDiscount;
然後再用true或false來判斷真實的狀態。
另外是有些否定字,例如
bool IsHidden;
bool IsDisabled;
在使用上要特別注意,因為在某些地方(例如CSS)會用這些否定字,那相對於這些產品,Model層或者介面程式的屬性要用正面字,還是用否定字當屬性?其實只要統一用法就好,但轉換時要特別注意邏輯關係:原因是系統的屬性可能會需要讓各別的系統去接受傳來的屬性,而不相關的系統可能會需要去適應其他系統帶來的變化。
還有一種是狀態詞的不同,例如On/Off, In/Out, Up/Down..等,在命名時也要注意一致性,以正向表列的方式命名,讓屬性可以很清楚的知道方向性。
所以,當看到這麼一個參數時
public class User{
public bool IsLocked { get; set;}
}
即使他的意思不是正面的,但在使用上也很會自然的應用這個值:
if(user.IsLocked){
//Kick off
}
程式可讀性也就提昇了。
當然常發生的情況是因為需求文件就是寫著反意的字(例如:如果帳號沒有被鎖定),然後就照這個語法來命名,但明天我們就會聊到像這種條件句,應該要怎麼處理比較好。